#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <stdlib.h>

//Esta función es la que usará el hiloLectura (hiloL) para leer continuamente desde el server
void *leer(void *);
int nread;
int sockd;

int main()
{	
	//creo el buffer de escritura, igual al de leida del server
	char bufW[1024];
	//int sockd;
	//int nread;
	pthread_t hiloL;
	int hiloEst;


	struct sockaddr_in addr={};

	
	if( (sockd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
		perror("socket()");
		return -1;
	}

	//address family
	addr.sin_family = AF_INET;

	//puerto
	addr.sin_port = htons(8888); //me parece que tiene que ser igual al del server

	//ip del server
	inet_aton("127.0.0.1", &addr.sin_addr);

	//trato de conectarme al server
	if(connect(sockd, (struct sockaddr *)&addr,sizeof addr) < 0){
		perror("Access denied");
		return -2;
	}
	
	//Hilo lector, este hilo lee continuamente el chat que envía el servidor
	hiloEst = pthread_create( &hiloL,NULL,leer,NULL );
	if(hiloEst){
		perror("hilo lectura");
		return -6;
	}

	//ACÁ debería hacer la lógica para escribir hacia el server continuamente
	do{
		//limpio el buffer
		memset(bufW,0,sizeof bufW);	

		//se supone que leo del teclado lo que escribe el usuario
		read(0,bufW,sizeof bufW);
		//se supone que escribo en el socket lo que el usuario tipeó
		write(sockd,bufW,sizeof bufW);
		
	}while(strcmp(bufW,"salir\n") != 0);
	
	//Para terminar el hilo lector
	/*En realidad esto no es necesario y se puede borrar, preguntar si tiene algun beneficio, porque de todas formas
	el hilo se destruye cuando el cliente se cierra */
	pthread_cancel(hiloL);
	
	//ACÁ debería crear un hilo que solo lea lo que el servidor me envia	
	//intento leer del socket con "buf"
	/*if( (nread = read(sockd, buf, sizeof buf)) < 0 ){
		perror("read()");
		return -3;
	}

	printf("leido: %s\n",buf); 

	*/

	close(sockd);
	return 0;
}


//función que utiliza el hilo de lectura
void * leer(void *parametro){	

	//FALTA LA COMUNICACIÓN NECESARIA PARA QUE CUANDO EL PADRE QUIERA SALIR SE LE AVISE AL HILO QUE SE TERMINE

	//buffer que se usará para leer
	char buf[1024];
	int inf =0;	
	do{
		//Borro el contenido de buf para asegurarme de que no haya basura
		memset(buf,0,sizeof buf);
		//Intento leer del socket con "buf"
		if( (nread = read(sockd,buf,sizeof buf)) <0 ){
			perror("read()");
			return NULL;
		}
	printf("server: %s\n",buf);
	}while(inf==0);
return NULL;	
}
